package com.york.tinyrpc.protoss.model;

import cn.hutool.core.util.StrUtil;
import com.york.tinyrpc.protoss.constant.TinyRpcConstants;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;


/**
 * ServiceMetaInfo
 * 服务元信息（注册信息）服务提供方将如下信息注册到注册中心去
 * 服务发现时也用该类作为实体
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ServiceMetaInfo {

    /**
     * 服务名称
     */
    private String serviceName;

    /**
     * 服务版本信息
     */
    private String serviceVersion = TinyRpcConstants.DEFAULT_SYSTEM_VERSION;

    /**
     * 服务域名
     */
    private String serviceHost;

    /**
     * 服务端口号
     */
    private Integer servicePort;

    /**
     * 服务分组
     */
    private String serviceGroup = "default";

    /**
     * protoss版本:服务权重（默认100）
     * 为了实现加权负载均衡器，添加服务的权重信息
     * 考虑实现难度，我选择静态权重的设计模式，即在注册服务时将服务的权重信息注入，权重不会变动，默认值为100
     */
    private Integer serviceWeight = 100;

    /**
     * 获取服务键名
     */
    public String getServiceKey() {
        // 后续可扩展服务分组
        return String.format("%s:%s:%s", serviceName, serviceVersion, serviceGroup);
    }

    /**
     * 获取服务注册节点键名
     */
    public String getServiceNodeKey() {
        return String.format("%s/%s:%s", getServiceKey(), serviceHost, servicePort);
    }

    /**
     * 获取完整服务地址(供消费方获取)
     */
    public String getServiceAddress() {
        if (!StrUtil.contains(serviceHost, "http")) {
            return String.format("http://%s:%s", serviceHost, servicePort);
        }
        return String.format("%s:%s", serviceHost, servicePort);
    }
}
